package com.wgy.day29多线程.解决线程安全问题的方式.同步方法;

/**
 * Created by pc on 2020/11/27 22:04
 * Description: LearningJava
 */

class RunnableImpl implements Runnable {

    private int ticket = 100;

    @Override
    public void run() {
        System.out.println("this:"+this);
        //使用死循环,让卖票一直重复执行
        while (true) {
            playTicket02();
        }
    }

    //定义一个同步方法
    public synchronized void playTicket01() {
        //先判断票是否存在
        if (ticket > 0) {
            //提高安全问题出现的概率,让程序睡眠
            try {
                Thread.sleep(10);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //票存在,卖票,ticket--
            System.out.println(Thread.currentThread().getName() + "-->正在买第" + ticket + "张票");
            ticket--;
        }
    }

    /*同步方法也会把方法内部的代码锁住,只让一个线程执行
      同步方法的锁对象是谁?
      就是实现类对象 new RunnableImpl()
      也就是this
      */
    public /*synchronized*/ void playTicket02() {

        synchronized(this){
            //先判断票是否存在
            if (ticket > 0) {
                //提高安全问题出现的概率,让程序睡眠
                try {
                    Thread.sleep(10);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //票存在,卖票,ticket--
                System.out.println(Thread.currentThread().getName() + "-->正在买第" + ticket + "张票");
                ticket--;
            }
        }

    }
}


